global._ = require('lodash')
global.APP_PATH = process.cwd()
global.path = require('path')
global.fs = require('fs')
global.configure = require('little-man-config')
global.pager = require('../../framework/lib/pager')
global.log4js = require('../../framework/lib/log4js')
global.helper = require('../../framework/lib/helper')
global.moment = require('moment')

const apiFree = require('api-free')                             // 载入api-free 核心组件

global.M = apiFree.M
global.DB = apiFree.DB
global.dbUtil = apiFree.dbUtil


const jwtService = require('../../service/common/kong/jwt')
const consumerService = require('../../service/common/kong/consumer')

// 遍历sys_app表，向kong 同步消费者
async function scan (args = {}) {
    let sysApps = await dbUtil.getAll('sys_app@iothub_platform')

    // 查找消费者

    for(let i=0;i<sysApps.length;i++) {
        let item = sysApps[i];

        await _scanItem(item)
    }

    return true;
}

async function _scanItem (item = {}) {
    // 查询消费者
    let _consumer = await consumerService.get(item.app_name)

    log4js.debug('查询kong consumer', item.app_name, _consumer)

    // 没有查到
    if (_consumer && !!_consumer.message) {
        log4js.debug('没有找到 kong consumer，准备添加', item.app_name, _consumer)
        // 添加消费者
        let _custom_add = await consumerService.add({ username: item.app_name, custom_id: item.id })

        log4js.debug('添加消费者', item.app_name, _custom_add)
    }

    let _tags = (item.services || '').split(',').filter(f => !!f).filter((cur, i, arr) => arr.findIndex(f => f === cur) === i)

    // 更新 tags
    let _tags_req = await consumerService.patch(item.app_name, { tags: _tags })
    log4js.debug('更新tags ', item.app_name, _tags_req)

    // 查询jwt token
    let _jwt = await jwtService.list(item.app_name)

    // 没有查到消费者
    if (_.get(_jwt, 'data', []).length <= 0) {
        log4js.debug('没有 jwt 准备添加', item.app_name)
        // 没有app_key 和 secret 生成新的
        if (!item.app_key || !item.app_secret) {
            item.app_key = helper.uuid_short()
            item.app_secret = helper.uuid()

            // 更新app_key和app_secret
            await M('sys_app@iothub_platform').update({
                app_key: item.app_key,
                app_secret: item.app_secret,
            }, { where: { id: item.id } })
        }

        let _jwt_req = await jwtService.add(item.app_name, {
            key: item.app_key,
            secret: item.app_secret,
        })

        log4js.debug('添加 jwt ', item.app_name, _jwt_req)
    }
}

// 初始化 api-free
apiFree.init(configure.get('apifree')).then(async ()=>{
    await scan()
    log4js.debug('DONE')
    process.exit(0)
}).catch(err => {
    log4js.error(err)
})


